package XueShengLian.copy;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
/**
 * DVD商店类
 * @author ty
 *
 */

public class DvdShop {
	 //存放多个dvd对象
	 private  Dvd[] dvds;
	 private  String name;
	 //记录元素的位置 :top的位置是有内容的
	 private int top=-1;
	 /**
	  * 构造方法
	  */
	 public DvdShop(){
	  dvds = new Dvd[50];
	 } 
	 public DvdShop(String name){
	  this();
	  this.name = name;
	    }
	 /**
	  * 用户自定义数组的大小
	  * @param capacity
	  */
	 public DvdShop(int capacity,String name){
	  if(capacity<=0){
	   throw new RuntimeException("容量不能小于等于0");
	  }
	  dvds = new Dvd[capacity];
	  this.name = name;
	 }
	 public String getName() {
	  return name;
	 }
	 public void setName(String name) {
	  this.name = name;
	 }

	 @Override
	 public boolean equals(Object obj) {
	  if (this == obj)
	   return true;
	  if (obj == null)
	   return false;
	  if (getClass() != obj.getClass())
	   return false;
	  DvdShop other = (DvdShop) obj;
	  if (!Arrays.equals(dvds, other.dvds))
	   return false;
	  if (name == null) {
	   if (other.name != null)
	    return false;
	  } else if (!name.equals(other.name))
	   return false;
	  if (top != other.top)
	   return false;
	  return true;
	 }
	 @Override
	 public String toString() {
	  return "DvdShop [dvds=" + Arrays.toString(dvds) + ", name=" + name
	    + ", top=" + top + "]";
	 }
	 /**
	  * 根据名字查找dvd的位置
	  * @param name
	  * @return
	  */


	 public int indexOf(String name){
	  int index=-1;
	  for(int i=0;i<=top;i++){
	   if(name.equals(dvds[i].getDvdNames())){
	    index= i;
	    break;
	   }
	   
	  }
	  return index;
	 }
	 
	 /**
	  * 查:存储空间是否已满
	  * @return
	  */
	 public boolean isFull(){
	  return  top==dvds.length-1;
	 }
	 /**
	  * 查:存储空间是否已空
	  * @return
	  */
	 public boolean isEmpty(){
	  return top==-1;
	 }
	 
	 public boolean  rent(String name){
	  int index= indexOf(name);
	  if(index==-1){
	   throw new RuntimeException("此 dvd不存在，借出失败");
	  }
	  if(dvds[index].isStatus()){
	   throw new RuntimeException("此 dvd已借出，借出失败");
	  }
	  Dvd  dvd =dvds[index];
	  dvd.setStatus(true);
	  dvd.setLoanDates(DateHelper.getDateStr());
	  return true;
	  
	 }
	 
	 /**
	  * 将index位置的dvd取出
	  * @param index
	  * @return
	  */
	 public  Dvd  get(int index){
	  if(index<0 ||index>top){
	   throw new RuntimeException("位置不存在");
	  }
	  return dvds[index];
	 }
	 /**
	  * 返回dvd的数量
	  * @return
	  */
	 public int size(){
	  return top+1;
	 }
	 /**
	  * 新增DVD
	  */
	 public boolean add(String name){
	  //如果满了抛出异常
	  if(isFull()){
	   throw new RuntimeException("存储空间已满");
	  }
	  //index为新输入dvd的位置，如果>=0，则dvd存在
	  int index = indexOf(name);
	  if(index>=0){
	   throw new RuntimeException("此dvd已存在");
	  }
	  //top为-1，所以要先++
	  dvds[++top] = new Dvd(name);
	  return true;
	  
	 }

	 /**
	  * 删除DVD
	  */
	 public boolean delete(String name){
	  //如果为空抛出异常
	  if(isEmpty()){
	   throw new RuntimeException("存储空间为空，无法删除");
	  }
	  //找dvd的位置
	  int index = indexOf(name);
	  //如果不存在，返回false
	  if(index==-1){
	   throw new RuntimeException("此 dvd不存在，借出失败");
	  }
	  //如果存在 通过移位来覆盖被删除的元素
	  for(int i=index;i<=top;i++){
	   dvds[i] =dvds[i+1];
	  } 
	  //改变top 
	   top--;
	   return true;
	 }
	 /**
	  * 借出DVD  loan
	  */
	 public boolean loan(String name) {
	  //如果为空抛出异常
	  if(isEmpty()){
	   throw new RuntimeException("存储空间为空，无法借出");
	  }
	  //找dvd的位置
	  int index = indexOf(name);
	  //如果不存在，返回false
	  if(index==-1){
	   throw new RuntimeException("此 dvd不存在，借出失败");
	  }
	  if(dvds[index].isStatus()){
	   throw new RuntimeException("此 dvd已借出，借出失败");
	  }
	  //如果存在 将dvd的借出状态改为true
	  dvds[index].setStatus(true);
	  //得到借出日期
	  dvds[index].setLoanDates(DateHelper.getDateStr());
	  return true;
	 }
	 /**
	  * 归还DVD  back
	  */
	 public  int back(String name) throws ParseException {
	  //如果满了抛出异常
	  if(isFull()){
	   throw new RuntimeException("存储空间已满");
	  }
	  //找dvd的位置
	  int index = indexOf(name);
	  //如果不存在
	  if(index==-1){
	   throw new RuntimeException("此 dvd不存在，归还失败");
	  }
	  if(dvds[index].isStatus()==false){
	   throw new RuntimeException("此 dvd未借出，归还失败");
	  }
	  
	  //把借出状态改为可借
	  dvds[index].setStatus(false);
	  //保存日期的字符串，先先原来的数据copy一下，再传新数据
	  String loanDates_bak = dvds[index].getLoanDates();
	  //把借出日期改为null
	  dvds[index].setLoanDates(null);
	  Date  date1 = DateHelper.getStrDate(loanDates_bak);
	  Date  date2  = new Date();
	  return 0; 
	 }
	 
}
